const { createClient } = require("redis");
const { redisConf } = require("../config/redis");

//redis[s]://[[username][:password]@][host][:port][/db-number]
const url = `redis://:${redisConf.password}@${redisConf.host}:${redisConf.port}/${redisConf.database}`;

// 创建全局 redis 客户端实例
let client;

/**
 * 初始化 redis 客户端
 */

const initClient = async () => {
  if (client) return;

  client = await createClient({ url })
    .on("error", (err) => console.log("Redis 连接失败！", err))
    .connect();
};

/**
 *
 * @param {*} key 键名
 * @param {*} value 键值，可以为基本数据类型和引用数据类型
 * @param {*} ttl 可选，以秒为单位的过期时间，默认不设置
 */
const setKey = async (key, value, ttl = null) => {
  if (!client) await initClient();

  value = JSON.stringify(value);

  await client.set(key, value);

  // 设置过期时间
  if (ttl !== null) {
    await client.expire(key, ttl);
  }
};

/**
 *
 * @param {*} key 要获取的键名
 * @returns 返回键名对应的键值，没有则为null
 */
const getKey = async (key) => {
  if (!client) await initClient();

  const value = await client.get(key);

  return value ? JSON.parse(value) : null;
};

const delKey = async (key) => {
  if (!client) await initClient();
  await client.del(key);
};

module.exports = {
  initClient,
  setKey,
  getKey,
  delKey,
};
